package lang;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;

import org.nutz.lang.Lang;

//What's nutz Lang.equals can do?
public class EqualPractice {
	
	class Pojo
	{
		int i=0;
		
		public Pojo(int x)
		{
			i=x;
		}
		
		@Override
		public boolean equals(Object obj) {
			if(null==obj) return false;
			else if(this==obj) return true;
			else if(!(obj instanceof Pojo)) return false;
			else return ((Pojo)obj).i==this.i;
		}
	}
	
	//判断重载后的equals是否相等
	void ObjEquals()
	{
		Pojo pojo1=new Pojo(5);
		Pojo pojo2=new Pojo(5);
		System.out.println(Lang.equals(pojo1, pojo2));
	}
	
	//对于两个Wrap版的数字比较。Lang会将其的toString进行比较。
	//也就是说，对于值类型的数字。只要数字相同，是不在乎类型如何的。
	void NumberEquals()
	{
		System.out.println( new Integer(5).equals(new Short((short) 5)));
		System.out.println(
				Lang.equals(
						new Integer(5), 
						new Short((short) 5)));
		
		System.out.println(
				Lang.equals(
						5,
						new Integer(5)));
	}
	
	//对于集合的值，Lang会用递归的方式进行判断
	void MapEquals()
	{
		Map<String,Map<String, String>> map1=new HashMap<String, Map<String,String>>();
		Map<String,Map<String, String>> map2=new HashMap<String, Map<String,String>>();
		HashMap<String, String> map11=new HashMap<String, String>();
		map11.put("11", "hello xyz".substring(0));
		map1.put("1", map11);
		HashMap<String, String> map22=new HashMap<String, String>();
		map22.put("11", "hello xyz".substring(0));
		map2.put("1", map22);
		//
		System.out.println(Lang.equals(map1, map2));
	}
	
	void ArrayEquals()
	{
		//jdk没有对数组的equals进行重写，调用数组的equals只是按照默认进行判断引用是否相等。这里使用Lang对数组判断的确方便许多。
		//只要类型是数组，不在乎数组的的类型如何
		int[] a={1,2,3};
		short[] s={1,2,3};
		System.out.println(Lang.equals(a,s));
		List<Integer> list=new ArrayList<Integer>();
		for(int i=1;i<4;i++) list.add(i);
		//默认的jdk中List的equals实现要求两个类型均为List才可以。这里Nutz将列表的概念推广，把数组也放进去了。
		System.out.println(
				Lang.equals(s, list));
		System.out.println(
				Lang.equals(list, a));
		
	}
	
	void CollectionsEquals()
	{
		//通用集合之间的对等比较
		Collection<Integer> c1=new ArrayList<Integer>();
		init(c1);
		Collection<Integer> c2=new Stack<Integer>();
		init(c2);
		System.out.println(c1.equals(c2));
		System.out.println(
				Lang.equals(c1, c2));
	}
	
	void init(Collection<Integer> c)
	{
		for (int i = 0; i < 5; i++) {
			c.add(i);
		}
	}
	
	static void ArrayContains()
	{
		String[] ss={"hello","world","!!"};
		System.out.println(
				Lang.contains(ss, "hello")
		);
	}
	
	public static void main(String[] args) {
		//test items contain in array
		ArrayContains();
		
		EqualPractice ep=new EqualPractice();
		ep.NumberEquals();
		ep.ObjEquals();
		ep.MapEquals();
		ep.ArrayEquals();
		ep.CollectionsEquals();
	}
}
